<?php

/**
 * contact : 刘经理 19326416371
 * company : 版权所属 四川北星惯牌科技有限公司
 **/

namespace app\api\validate;

use app\common\library\Sms;
use app\common\model\CaptainApplication;
use think\Validate;

class Authentication extends Validate
{
    /**
     * 真实姓名
     * @var
     */
    protected $name;

    /**
     * 身份证号码
     * @var
     *
     */
    protected $idcard;

    /**
     * 手机号
     * @var
     */
    protected $mobile;

    /**
     * 手机号验证码
     * @var
     */
    protected $captcha;

    /**
     * 验证规则
     */
    protected $rule = [
        //'idcard' => 'require|isValidIDCard:idcard|checkExists:idcard',
        'idcard' => 'require|isValidIDCard:idcard',
        'name'   => 'require',
        'mobile'   => 'require|checkMobile',
        'captcha'   => 'require|checkCaptcha',
    ];

    /**
     * 字段描述
     */
    protected $field = [
    ];
    /**
     * 提示消息
     */
    protected $message = [
        'idcard.require'=>'身份证不能为空',
        'idcard.isValidIDCard'=>'身份证必须是合法号码',
        //'idcard.checkExists'=>'当前身份证号已存在',
        'name.require'=>'真实姓名不能为空',
        'captcha.require'=>'手机验证码不能为空',
        'captcha.checkCaptcha'=>'手机验证码不正确',
        'mobile.require'=>'手机号不能为空',
        'mobile.checkMobile'=>'当前手机号已认证',
    ];
    public function __construct(array $rules = [], $message = [], $field = [])
    {
        parent::__construct($rules, $message, $field);
    }

    protected function checkExists($idcard){
        $this->setFiled('idcard',$idcard);
        $cardInfo = \app\common\model\Authentication::where('id_card',$idcard)->count();
        if ($cardInfo){
            return false;
        }else{
            return true;
        }
    }


    /**
     * 检查手机号是否存在
     * @param $mobile
     * @return bool
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    protected function checkMobile($mobile)
    {
        $this->setFiled('mobile',$mobile);
        $user = \app\common\model\Authentication::where('mobile',$mobile)->find();
        if ($user){
            return false;
        }else{
            return true;
        }
    }
    /**
     * 检查手机号格式
     * @param $mobile
     * @return bool
     */
    protected function ruleMobile($mobile)
    {
        $this->setFiled('mobile',$mobile);
        if (!preg_match("/^1\d{10}$/", $mobile)) {
            return false;
        }
        return true;
    }
    function isValidIDCard($idcard) {
        $this->setFiled('idcard',$idcard);
        // 验证长度和前17位数字
        if (!preg_match('/^\d{17}[0-9X]$/', $idcard)) {
            return false;
        }
        // 计算校验码
        $weights = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
        $checkcodes = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
        $sum = 0;
        for ($i = 0; $i < 17; $i++) {
            $sum += $idcard[$i] * $weights[$i];
        }
        $mod = $sum % 11;
        $checkcode = $checkcodes[$mod];
        // 验证校验码
        return strtoupper($idcard[17]) == $checkcode;
    }

    public function checkCaptcha($captcha)
    {
        $this->setFiled('captcha',$captcha);
        $mobile = $this->getFiled('mobile');
        if (!Sms::check($mobile, $captcha, 'authentication')) {
            return false;
        }
        return true;
    }

    protected function setFiled($key,$value)
    {
        $this->$key = $value;
    }

    public function getFiled($key)
    {
        return $this->$key;
    }
}
